I. Wzorce kreacyjne
1. Singleton
2. Budowniczy
3. Prototyp
4. Fabryka
5. Fabryka abstrakcyjna
II. Wzorce strukturalne
1. Adapter
2. Most
3. Kompozyt
4. Dekorator
5. Fasada
6. Pyłek
7. Pełnomocnik
III. Wzorce czynnościowe
1. Łańcuch zobowiązań
2. Polecenie
3. Interpreter
4. Iterator
5. Mediator
6. Pamiątka
7. Obserwator
8. Stan
9. Strategia
10. Metoda szablonowa
11. Odwiedzający

Pamiątka (memento) - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec Pamiątka (memento) służy do uzewnętrznienia stan obiektu, zazwyczaj do dostarczenia funkcjonalność przywracania.
Użyty jest gdy chcemy przywrócić obiekt do poprzedniego stanu.
2. Problem:
Chcemy mieć możliwość powrócić do poprzedniego stanu obiektu.
Chcemy zaimplementować funkcję cofnij (undo) lub wycofaj (rollback).

3. Rozwiązanie:
Osiągamy to poprzez uzewnętrznienie obiektu w stan wewnętrzny, taki że można do niego później zwrócić.
Inna zaleta użycia tego wzorca powoduje że osłania on złożone elementy wewnętrzne przed innymi obiektami.
Wzorzec memento opiera się na trzech klasach: Originator, Memento i Caretaker.
Originator: to obiekt, dla którego musimy zapamiętać stan na wypadek, gdybyśmy musieli go kiedyś przywrócić.
Caretaker: jest to klasa odpowiedzialna za wyzwalanie zmian w inicjatorze lub za wyzwalanie akcji,
przez którą inicjator powraca do poprzedniego stanu.
Memento: Jest to klasa odpowiedzialna za przechowywanie wewnętrznego stanu inicjatora.

4. Diagram klas wzorca Pamiątka (memento):


5. Implementacja:
Klasa testująca:
  1. public class MementoTest {
  2. public static void main(String[] args) {
  3.  
  4. FileWriterCaretaker caretaker = new FileWriterCaretaker();
  5.  
  6. FileWriterUtil fileWriter = new FileWriterUtil("data.txt");
  7. fileWriter.write("*Wypisanie pierwszej linii\n");
  8. System.out.println("Pierwsza edycja");
  9. System.out.print(fileWriter);
  10. System.out.println("zapisanie stanu i dodanie drugiej linii");
  11. caretaker.save(fileWriter);
  12. fileWriter.write("*Dopisanie drugiej linii\n");
  13. System.out.println("Wypisanie po drugiej edycji stanu");
  14. System.out.print(fileWriter);
  15. System.out.println("Przywrócenie starego stanu i wyświetlenie");
  16. caretaker.undo(fileWriter);
  17. System.out.print(fileWriter);
  18.  
  19. }
  20. }
  1. // Caretaker
  2. public class FileWriterCaretaker {
  3.  
  4. private Memento obj;
  5.  
  6. public void save(FileWriterUtil fileWriter) {
  7. this.obj = fileWriter.save();
  8. }
  9.  
  10. public void undo(FileWriterUtil fileWriter) {
  11. fileWriter.revert(obj);
  12. }
  13. }
  14.  
  15. // Originator
  16. public class FileWriterUtil {
  17.  
  18. private String fileName;
  19. private StringBuilder content;
  20.  
  21. public FileWriterUtil(String file) {
  22. this.fileName = file;
  23. this.content = new StringBuilder();
  24. }
  25.  
  26. @Override
  27. public String toString() {
  28. return this.content.toString();
  29. }
  30.  
  31. public void write(String str) {
  32. content.append(str);
  33. }
  34.  
  35. public Memento save() {
  36. return new Memento(this.fileName, this.content);
  37. }
  38.  
  39. public void revert(Memento memento) {
  40. this.fileName = memento.getFileName();
  41. this.content = memento.getContent();
  42. }
  43. }
  44.  
  45. // Memento
  46. public class Memento {
  47. private String fileName;
  48. private StringBuilder content;
  49.  
  50. public Memento(String file, StringBuilder content) {
  51. this.fileName = file;
  52. this.content = new StringBuilder(content);
  53. }
  54.  
  55. public String getFileName() {
  56. return fileName;
  57. }
  58.  
  59. public StringBuilder getContent() {
  60. return content;
  61. }
  62. }
Wynik programu jest następujący:
Pierwsza edycja
*Wypisanie pierwszej linii
zapisanie stanu i dodanie drugiej linii
Wypisanie po drugiej edycji stanu
*Wypisanie pierwszej linii
*Dopisanie drugiej linii
Przywrócenie starego stanu i wyświetlenie
*Wypisanie pierwszej linii
6. Zastosowanie w kodzie java:
- java.util.Date
- java.io.Serializable
- javax.faces.component.StateHolder - wszystkie implementacje
created by cv.java.org.pl © 2023 All Rights Reserved.